From d8fa063ad25bfa74b282642dff8b48c6d13d549f Mon Sep 17 00:00:00 2001 From: "smh22@firebug.cl.cam.ac.uk" Date: Sat, 26 Nov 2005 12:13:39 +0100 Subject: [PATCH] Fix save/restore and migrate on x86_64. Signed-off-by: Steven Hand --- tools/libxc/xc_linux_save.c | 17 ++++++++++------- tools/python/xen/xend/XendCheckpoint.py | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/tools/libxc/xc_linux_save.c b/tools/libxc/xc_linux_save.c index 467598fec4..16eae762fc 100644 --- a/tools/libxc/xc_linux_save.c +++ b/tools/libxc/xc_linux_save.c @@ -457,6 +457,15 @@ void canonicalize_pagetable(unsigned long type, unsigned long pfn, xen_start = (hvirt_start >> L2_PAGETABLE_SHIFT_PAE) & 0x1ff; } + if (pt_levels == 4 && type == L4TAB) { + /* + ** XXX SMH: should compute these from hvirt_start (which we have) + ** and hvirt_end (which we don't) + */ + xen_start = 256; + xen_end = 272; + } + /* Now iterate through the page table, canonicalizing each PTE */ for (i = 0; i < pte_last; i++ ) { @@ -721,12 +730,6 @@ int xc_linux_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters, } /* Domain is still running at this point */ - - if (live && (pt_levels == 4)) { - ERR("Live migration not supported for 64-bit guests"); - live = 0; - } - if (live) { if (xc_shadow_control(xc_handle, dom, @@ -811,7 +814,7 @@ int xc_linux_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters, for (i = 0; i < max_pfn; i++) { mfn = live_p2m[i]; - if((mfn != 0xffffffffUL) && (mfn_to_pfn(mfn) != i)) { + if((mfn != INVALID_P2M_ENTRY) && (mfn_to_pfn(mfn) != i)) { DPRINTF("i=0x%x mfn=%lx live_m2p=%lx\n", i, mfn, mfn_to_pfn(mfn)); err++; diff --git a/tools/python/xen/xend/XendCheckpoint.py b/tools/python/xen/xend/XendCheckpoint.py index 04fda474b4..a50a7b2cff 100644 --- a/tools/python/xen/xend/XendCheckpoint.py +++ b/tools/python/xen/xend/XendCheckpoint.py @@ -128,7 +128,7 @@ def restore(xd, fd): try: l = read_exact(fd, sizeof_unsigned_long, "not a valid guest state file: pfn count read") - nr_pfns = unpack("=L", l)[0] # XXX endianess + nr_pfns = unpack("L", l)[0] # native sizeof long if nr_pfns > 16*1024*1024: # XXX raise XendError( "not a valid guest state file: pfn count out of range") -- 2.30.2